home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / gtlayout_lib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-12  |  4.2 KB  |  192 lines

  1. #include "gtlayout.h"
  2.  
  3. #include <dos/dos.h>
  4.  
  5. #include <exec/execbase.h>
  6. #include <exec/libraries.h>
  7.  
  8. #include <clib/exec_protos.h>
  9. #include <pragmas/exec_pragmas.h>
  10.  
  11. struct GTLayoutBase
  12. {
  13.     struct Library         LibNode;
  14.     struct ExecBase        *SysBase;
  15.     struct SignalSemaphore     LockSemaphore;
  16.     BPTR             LibSegment;
  17. };
  18.  
  19. #define SysBase        GTLayoutBase->SysBase
  20. #define LockSemaphore    GTLayoutBase->LockSemaphore
  21. #define LibSegment    GTLayoutBase->LibSegment
  22.  
  23. STATIC struct Library * __asm __saveds    LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase);
  24. STATIC struct Library * __asm __saveds    LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase);
  25. STATIC BPTR __asm __saveds        LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase);
  26. STATIC BPTR __asm __saveds        LibClose(register __a6 struct GTLayoutBase *GTLayoutBase);
  27. STATIC LONG __asm __saveds        LibNull(register __a6 struct GTLayoutBase *GTLayoutBase);
  28.  
  29. STATIC APTR LibVectors[] =
  30. {
  31.     LibOpen,
  32.     LibClose,
  33.     LibExpunge,
  34.     LibNull,
  35.  
  36.     LT_LevelWidth,
  37.     LT_DeleteHandle,
  38.     LT_CreateHandle,
  39.     LT_CreateHandleTagList,
  40.     LT_Rebuild,
  41.     LT_HandleInput,
  42.     LT_BeginRefresh,
  43.     LT_EndRefresh,
  44.     LT_GetAttributesA,
  45.     LT_SetAttributesA,
  46.     LT_AddA,
  47.     LT_NewA,
  48.     LT_EndGroup,
  49.     LT_LayoutA,
  50.     LT_LayoutMenusA,
  51. #ifdef DO_FRACTION_KIND
  52.     LT_Fixed2String,
  53.     LT_String2Fixed,
  54.     LT_FixedMult,
  55. #else
  56.     LibNull,
  57.     LibNull,
  58.     LibNull,
  59. #endif    /* DO_FRACTION_KIND */
  60.     LT_LabelWidth,
  61.     LT_LabelChars,
  62.     LT_LockWindow,
  63.     LT_UnlockWindow,
  64.     LT_DeleteWindowLock,
  65.     LT_ShowWindow,
  66.     LT_Activate,
  67.     LT_PressButton,
  68.     LT_GetCode,
  69.     LT_GetIMsg,
  70.     LT_ReplyIMsg,
  71.     LT_BuildA,
  72.     LT_RebuildTagList,
  73.     LT_UpdateStrings,
  74.  
  75.     (APTR)-1
  76. };
  77.  
  78. extern UBYTE __far    LibName[],
  79.             LibID[];
  80.  
  81. extern LONG __far    LibVersion,
  82.             LibRevision;
  83.  
  84. struct { ULONG DataSize; APTR Table; APTR Data; struct GTLayoutBase * (*Init)(); } __aligned LibInitTab =
  85. {
  86.     sizeof(struct GTLayoutBase),
  87.     LibVectors,
  88.     NULL,
  89.     LibInit
  90. };
  91.  
  92. STATIC struct GTLayoutBase * __asm __saveds
  93. LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase)
  94. {
  95.     GTLayoutBase -> LibNode . lib_Node . ln_Type    = NT_LIBRARY;
  96.     GTLayoutBase -> LibNode . lib_Node . ln_Name    = LibName;
  97.     GTLayoutBase -> LibNode . lib_Flags        = LIBF_CHANGED | LIBF_SUMUSED;
  98.     GTLayoutBase -> LibNode . lib_Version        = LibVersion;
  99.     GTLayoutBase -> LibNode . lib_Revision        = LibRevision;
  100.     GTLayoutBase -> LibNode . lib_IdString        = (APTR)LibID;
  101.  
  102.     LibSegment    = Segment;
  103.     SysBase        = ExecBase;
  104.  
  105.     InitSemaphore(&LockSemaphore);
  106.  
  107. #ifdef CPU_ANY
  108.     if(SysBase -> LibNode . lib_Version < 37)
  109. #else
  110.     if(SysBase -> LibNode . lib_Version < 37 || !(SysBase -> AttnFlags & AFF_68020))
  111. #endif    /* CPU_ANY */
  112.         return(NULL);
  113.     else
  114.         return(GTLayoutBase);
  115. }
  116.  
  117. STATIC struct Library * __asm __saveds
  118. LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase)
  119. {
  120.     GTLayoutBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
  121.  
  122.     GTLayoutBase -> LibNode . lib_OpenCnt++;
  123.  
  124.     if(GTLayoutBase -> LibNode . lib_OpenCnt == 1)
  125.     {
  126.         ObtainSemaphore(&LockSemaphore);
  127.  
  128.         if(LT_Init())
  129.             ReleaseSemaphore(&LockSemaphore);
  130.         else
  131.         {
  132.             LT_Exit();
  133.  
  134.             ReleaseSemaphore(&LockSemaphore);
  135.  
  136.             GTLayoutBase -> LibNode . lib_OpenCnt--;
  137.  
  138.             return(NULL);
  139.         }
  140.     }
  141.  
  142.     return(GTLayoutBase);
  143. }
  144.  
  145. STATIC BPTR __asm __saveds
  146. LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase)
  147. {
  148.     if(!GTLayoutBase -> LibNode . lib_OpenCnt && LibSegment)
  149.     {
  150.         BPTR TempSegment = LibSegment;
  151.  
  152.         Remove((struct Node *)GTLayoutBase);
  153.  
  154.         FreeMem((BYTE *)GTLayoutBase - GTLayoutBase -> LibNode . lib_NegSize,GTLayoutBase -> LibNode . lib_NegSize + GTLayoutBase -> LibNode . lib_PosSize);
  155.  
  156.         return(TempSegment);
  157.     }
  158.     else
  159.     {
  160.         GTLayoutBase -> LibNode . lib_Flags |= LIBF_DELEXP;
  161.  
  162.         return(NULL);
  163.     }
  164. }
  165.  
  166. STATIC BPTR __asm __saveds
  167. LibClose(register __a6 struct GTLayoutBase *GTLayoutBase)
  168. {
  169.     if(GTLayoutBase -> LibNode . lib_OpenCnt > 0)
  170.         GTLayoutBase -> LibNode . lib_OpenCnt--;
  171.  
  172.     if(!GTLayoutBase -> LibNode . lib_OpenCnt)
  173.     {
  174.         ObtainSemaphore(&LockSemaphore);
  175.  
  176.         LT_Exit();
  177.  
  178.         ReleaseSemaphore(&LockSemaphore);
  179.  
  180.         if(GTLayoutBase -> LibNode . lib_Flags & LIBF_DELEXP)
  181.             return(LibExpunge(GTLayoutBase));
  182.     }
  183.  
  184.     return(NULL);
  185. }
  186.  
  187. STATIC LONG __asm __saveds
  188. LibNull(register __a6 struct GTLayoutBase *GTLayoutBase)
  189. {
  190.     return(NULL);
  191. }
  192.